[AJUDA] Exercicio Registro C

1. [AJUDA] Exercicio Registro C

Lucas Tadeu Teixeira
lucastt182

(usa Ubuntu)

Enviado em 16/06/2010 - 16:11h

Olá, eu queria pedir ajuda dos programadores mais experientes com um exercício de C.

Eis o enunciado:
"Foi realizada uma pesquisa sobre algumas características físicas de 50 habitantes de certa região. De cada habitante foram coletados os seguintes dados: sexo, altura, idade e cor dos olhos(A- azuis, V- verdes, C-castanhos).
Faça um programa que leia os dados armazene-os em um registro tipo vetor e determine:

* a média das pessoas com olhos castanhos e altura superior a 1.60 m;
* a maior idade dos habitantes;
* a quantidade de indivíduos do sexo feminino com idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70m;
* percentual de homens;"

Estou com problemas nos dois últimos requisitos do programa, aqui está meu código ( utilizei um vetor de tamanho 2 no registro apenas para facilitar no processo de debug). Por enquanto estou apenas exibindo a quantidade de homens.
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // a função strupr necessita desta biblioteca

// declarando os registros
struct{

char sexo[1], corOlhos[1];
float altura;
int idade;


} pessoas[2];

int main(){

// declarando as variáveis
int i, k, maiorIdade, qtdMulheres, qtdHomens;
float somaIdades;
char handler[1];

// inserindo os dados no registro
for(i=0;i<2;i++){

printf("\nQual o sexo da %da. pessoa? M/F \n", i+1);
scanf("%s", handler);

// Este loop converte o que handler recebe para maiúsculo.
for(k=0;handler[k]!=''; k++){

handler[k] = toupper(handler[k]);

}

// Fazendo a verificação do que a variável handler recebeu. Se passar na verificação, a variável pessoas[i].sexo recebe o valor de handler.
// Se não passar na verificação, exibe mensagem e retorna ao início do loop
if((strcmp(handler,"M")== 0) || (strcmp(handler, "F")==0)){

for(k=0;handler[k]!=''; k++)

pessoas[i].sexo[k] = handler[k];

} else {

printf("\nSexo inválido, digite apenas M ou F !");
i--;
continue;

}

printf("\nDigite a altura: ");
scanf("%f", &pessoas[i].altura);

printf("\nDigite a idade: ");
scanf("%d", &pessoas[i].idade);

printf("\nQual a cor dos olhos? C(castanhos)/A(azuis)/V(verdes) : ");
scanf("%s", handler);

// Passando o que foi digitado para cor dos olhos para MAIÚSCULO e fazendo a verificação do que foi digitado.
for(k=0; handler[k]!=''; k++)

handler[k] = toupper(handler[k]);

// Verificando se o valor digitado para cor dos olhos é igual a C, A ou V
if((strcmp(handler,"C")==0) || (strcmp(handler,"A")==0) || (strcmp(handler,"V")==0)) {

for(k=0;handler[k]!=''; k++)
pessoas[i].corOlhos[k] = handler[k];

} else {

printf("\n\nA cor dos olhos digitada é inválida! Utilize: C(castanhos), A(azuis) ou V(verdes!\n");
i--;
continue;

}

}

// verificando o registro

somaIdades = 0;
maiorIdade = 0;


for(i=1;i<2;i++){

// soma a idade das pessoas de olhos castanhos e altura superior a 1,60 m
// IMPORTANTE : para fazer a comparação entre 2 STRING's utiliza-se o comando STRCMP( string1, string2) => retorna ZERO se forem iguais
if((strcmp(pessoas[i].corOlhos,"C")==0) && (pessoas[i].altura>1.60)) {

somaIdades += pessoas[i].idade;

}

// verifica qual a maior idade entre as pessoas cadastradas no registro
if(pessoas[i].idade> pessoas[maiorIdade].idade)
maiorIdade = i;



}

qtdMulheres = 0;
qtdHomens = 0;

// é nesta parte aqui embaixo que estou com problemas V

for(i=0;i<2;i++){

// verifica a quantidade de mulheres com idade entre 20 e 45 anos(inclusive). Se a verificação anterior retornar 0(zero), verifica a quantidade de mulheres de olhos verdes e altura //inferior a 1.70 m e salva essa quantidade em uma variável
if(strcmp(pessoas[i].sexo,"F")==0){

// #rofl, essa verificação aqui tá pequena hein :P
if((pessoas[i].idade>20) && (pessoas[i].idade<=45))
qtdMulheres++;

if((strcmp(pessoas[i].corOlhos,"V")==0) && (pessoas[i].altura<1.70))
qtdMulheres++;

}

// calcula a quantidade de homens existentes no cadastro
if(strcmp(pessoas[i].sexo,"M")==0)
qtdHomens++;


}


// exibindo os resultados das verificações

printf("\nA media das idades de pessoas de olhos castanhos e altura superior a 1.60 m é : %3.2f", somaIdades/2);
printf("\nA maior idade das pessoas cadastradas é : %d", pessoas[maiorIdade].idade);
printf("\nA quantidade de mulheres de idade entre 20 e 45 anos(inclusive) ou que tenham olhos verdes e altura inferior a 1.70 m é : %d", qtdMulheres);
printf("\nA quantidade de homens é: %d\n", qtdHomens);

return 0;

}


Obrigado pela atenção (Y)


  


2. Re: [AJUDA] Exercicio Registro C

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 24/09/2010 - 23:14h

Olá!

Analisando rapidamente seu código, percebi um pequeno engano na sua lógica:

// #rofl, essa verificação aqui tá pequena hein :P
if((pessoas[i].idade>20) && (pessoas[i].idade<=45))
qtdMulheres++;

if((strcmp(pessoas[i].corOlhos,"V")==0) && (pessoas[i].altura<1.70))
qtdMulheres++;

O enunciado diz para verificar se mulher com idade entre 21 e 45 OU mulher, olhos verdes e altura menor que 1.70. Na sua implementacao, os dois casos são testados, independente da veracidade ou não do primeiro condicional. Isto é, se for mulher, idade entre 21 e 45, olhos verdes e altura menor que 1.70m, será contabilizada duas vezes. A solução seria trocar o segundo "if" por um "else if".

Quanto a última questão, você está contabilizando o numero de homens, e não o percentual dos mesmos.

Para isso, o percentual é dado por:
Percentual = ( Numero de homens * 100 ) / Numero total de pessoas

Não sei se esse é o erro que se refere. Se não for, por favor descreva ele aqui que faço questão de ajudar na resolução.

Espero ter ajudado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts